package com.vecspace.dayu.code.service;

import java.util.Date;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;

import com.vecspace.dayu.code.dao.ProjectUserDao;
import com.vecspace.dayu.code.pojo.ProjectUser;
import com.vecspace.exception.HException;
import com.vecspace.utils.NumberUtil;

/**功能描述 DAYU-项目用户。暂不验证密码，输入用户名即可进入,loginId与oa里面的loginId保持一致。以后可考虑同步OA的增、删、改查等业务操作的service类
 * @author wanghua
 */
@Service("dayu_projectUserService")
public class ProjectUserService {
	/** 根据ID查询 DAYU-项目用户。暂不验证密码，输入用户名即可进入,loginId与oa里面的loginId保持一致。以后可考虑同步OA 
	 * @param id   主键值
	 * @return ProjectUser
	 * @throws Exception
	 * @author wanghua
	 */
	public ProjectUser getProjectUser(Long id) throws Exception{
		return projectUserDao.getProjectUser(id);
	}
	
	/**获取项目用户
	 * 
	 * @param loginId
	 * @param projectId
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 */
	public ProjectUser getProjectUser(String loginId, Long projectId) throws Exception {
		if(loginId == null)return null;
		loginId = loginId.trim().toLowerCase();
		ProjectUser projectUser = projectUserDao.getProjectUser(loginId, projectId);
		return projectUser;
	}
	
	/**获取项目中的所有用户
	 * 
	 * @param projectId
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 */
	public List<ProjectUser> getProjectUsers(Long projectId) throws Exception {
		return projectUserDao.getProjectUsers(projectId);
	}
	
	/**判断用户id是否存在于任何项目（或者超级管理员）
	 * @param loginId
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 */
	public boolean hasUser(String loginId) throws Exception {
		boolean hasUser = projectUserDao.hasUser(loginId);
		return hasUser;
	}
	
	/**
	 * 是否超级管理员
	 * @param loginId
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 */
	public boolean isSuperAdmin(String loginId) throws Exception {
		if(loginId == null)return false;
		loginId = loginId.trim().toLowerCase();
		ProjectUser projectUser = projectUserDao.getProjectUser(loginId, -1L);
		if(projectUser != null) {
			return true;
		}
		else {
			return false;
		}
	}
	
	/**
	 * 是否项目管理员（或者超级管理员）
	 * @param loginId
	 * @param projectId
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 */
	public boolean isProjectAdmin(String loginId, Long projectId) throws Exception {
		if(loginId == null)return false;
		loginId = loginId.trim().toLowerCase();
		ProjectUser projectUser = projectUserDao.getProjectUser(loginId, projectId);
		if(projectUser != null) {
			return true;
		}
		else {
			if(isSuperAdmin(loginId)) {
				return true;
			}
			return false;
		}
	}
	
	/**添加超级管理员
	 * 
	 * @param userId  要增加为超级管理员的用户的id
	 * @param loginId 当前登录用户的id
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 */
	public ProjectUser addSuperAdmin(String userId, String loginId) throws Exception {
		boolean superAdmin =  isSuperAdmin(loginId);
		if(!superAdmin) {
			throw new HException("您不是超级管理员，不能添加其他用户为超级管理员");
		}
		Long projectId = -1L;
		ProjectUser projectUser = this.getProjectUser(userId, projectId);
		if(projectUser == null) {
			projectUser = new ProjectUser();
			projectUser.setLoginId(userId);
			projectUser.setProjectId(projectId);
			projectUser.setRoleCode("3");
			this.saveProjectUser(projectUser, loginId);
		}
		return projectUser;		
	}
	
	/**添加项目成员
	 * 
	 * @param userId  要增加为项目超级管理员的用户的id
	 * @param projectId 项目id
	 * @param isProjectAdmin 是否项目管理员
	 * @param loginId 当前登录用户的id
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 */
	public ProjectUser addProjectUser(String userId, Long projectId, boolean isProjectAdmin, String loginId) throws Exception {
		boolean isAdmin =  this.isSuperAdmin(loginId);
		if(!isAdmin) {
			isAdmin = this.isProjectAdmin(loginId, projectId);
		}
		if(!isAdmin) {
			throw new HException("您不是管理员，不能添加其他用户为项目管理员");
		}

		ProjectUser projectUser = this.getProjectUser(userId, projectId);
		if(projectUser == null) {
			projectUser = new ProjectUser();
			projectUser.setLoginId(userId);
			projectUser.setProjectId(projectId);
		}
		if(isProjectAdmin) {
			projectUser.setRoleCode("3");
		}else {
			projectUser.setRoleCode("1");
		}
		this.saveProjectUser(projectUser, loginId);
		return projectUser;		
	}
	
	/**项目用户变更为项目管理员
	 * 
	 * @param projectUserId
	 * @param isProjectAdmin 是否管理员
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 */
	public ProjectUser changeProjectAdmin(Long projectUserId, boolean isProjectAdmin, String loginId) throws Exception {		
		ProjectUser projectUser = this.getProjectUser(projectUserId);
		if(projectUser != null) {
			Long projectId = projectUser.getProjectId();
			if(!projectUserService.isProjectAdmin(loginId, projectId)) {
				throw new HException("您不是管理员，不能添加其他用户为项目管理员");
			}
			
			if(isProjectAdmin) {
				projectUser.setRoleCode("3");
			}else {
				projectUser.setRoleCode("1");
			}
			this.saveProjectUser(projectUser, loginId);
		}
		return projectUser;
	}
	/** 插入或修改 DAYU-项目用户。暂不验证密码，输入用户名即可进入,loginId与oa里面的loginId保持一致。以后可考虑同步OA ，item中的所有属性都会更新到数据库中（包括属性值为null的，也会将null更新到数据库，覆盖之前的值）。
	 * @param item	要保存的对象
	 * @return void
	 * @throws Exception
	 * @author wanghua
	 */
	public void saveProjectUser(ProjectUser item, String loginId) throws Exception{
		if (item == null){
			return;
		}
		/*** 下面开始对item对象进行校验，如逻辑关系等 ***/
		/*** 结束校验 ***/
		Date date = new Date();
		if (NumberUtil.isNullOrZero(item.getId())) {

			item.setId(null);
			item.setCreateUser(loginId);//更新记录创建人ID
			item.setCreateTime(date);

		} else {

		}
		projectUserDao.saveProjectUser(item);
	}
	
	/** 根据ID删除 DAYU-项目用户。暂不验证密码，输入用户名即可进入,loginId与oa里面的loginId保持一致。以后可考虑同步OA 
	 * @param id	主键值
	 * @return void
	 * @throws Exception
	 * @author wanghua
	 */
	public void deleteProjectUser(Long id) throws Exception{		
		projectUserDao.deleteProjectUser(id);
	}
	
	/** property **/
	@Autowired
	private ProjectUserDao projectUserDao;
	@Autowired
	ProjectUserService projectUserService;
}
